/*
Driver.java
Fecha: 2 de septiembre de 2011
Autor: Claudia Grajeda
Descripcion: 
*/


import java.util.Scanner;
import java.util.InputMismatchException;

import java.util.*;


public class Driver {
	
	

	public static void main (String[] args){
	
		//declaracion de objetos
		List<Cliente> data = new ArrayList<Cliente>();
		Cliente[] clientes;
		Cliente clientefuera = new Cliente();
		Cliente clienteadentro = new Cliente();
		
		Ventanillas<Cliente> evento1 = new Ventanillas<Cliente>();
		
		
		int cantidad2, entrada, actual, num1, num2, num3;
		
		
		System.out.println("\n   HOJA DE TRABAJO 5 :O)\n");
		
		
		
		do{
			cantidad2 = (int)obtenerNumero("INGRESE LA CANTIDAD TOTAL DE CLIENTES ", false);
			if (cantidad2 <= 0 )
				System.out.println("ERROR");
		}
		while (cantidad2 <= 0);
		

		//agregar clientes a la lista
		clientes = new Cliente[cantidad2];
	
		for (num1 =0; num1<cantidad2; num1++ ){
			clientes[num1] = new Cliente();
		}
		
		num1 = 0;
		
		do{
			do{
				entrada = (int)obtenerNumero("\n INGRESE EL TIEMPO DE ENTRADA DEL CLIENTE " + (num1+1) + ":", false);
				if ((entrada <=0) || (entrada > 480)){
					System.out.println("ERROR, INGRESO INVALIDO");
				}
				if (num1 > 0){
					num3 = num1-1;
					if (clientes[num3].getEntrada()  > entrada){  
							System.out.println("ERROR, EL NUMERO INGRESADO ES MENOR AL TIEMPO ANTERIOR");
						}
					if (clientes[num3].getEntrada() <=  entrada ){ 
						clientes[num1].setEntrada(entrada); 
						num1++;
					}
				}
				else{
					clientes[num1].setEntrada(entrada);
					num1++;
				}
				
			}
			while((entrada <=0) || (entrada > 480));
		}
		while(num1 < cantidad2);
		
		for (num1 =0; num1<cantidad2; num1++ ){
			data.add(clientes[num1]);
		}	
		
			
		System.out.println("\n Se han ingresado todas las horas de entrada, gracias!! \n");

		
		//todo lo del banco
		//1. ingresar a la cola si estamos en el tiempo q entraron
		//2. obtener tiempo de transaccion del primero de cada cola y cambiar evento
		//3. regresar el cliente con el tiempo final y evento de salida a data
		//4. obtener nueva hora 
		
		while(data.isEmpty() != true){
			
			System.out.println("\n Lista de eventos: \n");
			System.out.print(data.toString());
			System.out.println("\n ---------------------- \n");
			
			clienteadentro = data.get(0);
			if(clienteadentro.getSal() == 0){
				//ingresar clientes a columna
				actual = data.get(0).getEntrada();	
			}
			else{
				actual = data.get(0).getSal();
				clientes[0]=evento1.remove(data.get(0));    //quitar de la cola
				
				
			}
			System.out.println("Hora actual: " + actual);
				
				
			if (clienteadentro.getEvento()==true){   //evento true
				if (clienteadentro.getEntrada() == actual ){//si estamos en el tiempo q entro moverlo a la cola
					
					clientefuera =data.remove(0);    //quitar d la lista d eventos
									
					evento1.add(clientefuera);    //moverlo a la cola  con menos clientes
					 evento1.setTransaccion();			//tiempo de transaccion
					
					
					System.out.println("\n Estado de las Colas:" );
					System.out.println(evento1.toString());
					System.out.println("\n ---------------------- \n");
									
					clientes[0]=clientefuera;	//obtener el cliente q entro
					
					clientes = evento1.ordenar(clientes, clientes.length );	//ordenar
					
					num2 = data.size() + 1;
					data.clear();
					for (num1 =0; num1<num2; num1++ ){
							data.add(clientes[num1]);
					}	
					
				}
			
			}
			else{
				System.out.println("\n Cliente que sale del banco: \n");
				
				System.out.println(clienteadentro);
				
				data.remove(clienteadentro);
				
				System.out.println("\n Estado de las Colas:" );
				System.out.println(evento1.toString());
				System.out.println("\n ---------------------- \n");
						
			}
		}
		
		System.out.println("\nYa no hay mas Clientes que atender!! \n");
			
		
	
	}
	
	//ObtenerNumero
		 public static double obtenerNumero(String mensaje, boolean mostrar){
			 Scanner ingreso = new Scanner(System.in);
		     double num = -1;
		        
		     System.out.print(mensaje);
		     try{
		    	 num = ingreso.nextDouble();
		     }
		     catch(InputMismatchException exception){
		         if (mostrar)
		        	 System.out.println("\nERROR: ~~> Dato invalido. :O(\n");
		     }
		     finally{
		    	 ingreso.nextLine();//Atrapar el ENTER
		     }
		     return num;
		 }
	
}
